package com.duoec.dw.lineage.service;

import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLOrderBy;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause;
import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.duoec.dw.lineage.dto.MultiTableLineageDto;
import com.duoec.dw.lineage.dto.TableFieldDependencyDto;
import com.duoec.dw.lineage.dto.TableFieldLineageDto;
import com.duoec.dw.lineage.dto.TableLineageDto;

import java.util.LinkedHashSet;
import java.util.List;

/**
 * @author xuwenzhen
 */
public interface HiveAnalyser {
    /**
     * 分析statement
     *
     * @param statement SQLStatement
     * @return 当前操作的血缘关系
     */
    TableLineageDto analyseStatement(SQLStatement statement);

    /**
     * 分析 select 查询语句
     *
     * @param sqlSelectQuery      查询脚本
     * @param withAsTableLineages with-as
     * @return 当前查询脚本的血缘关系数据
     */
    TableLineageDto analyseQuery(SQLSelectQuery sqlSelectQuery, MultiTableLineageDto withAsTableLineages);

    /**
     * 分析from语句
     *
     * @param from                SQLTableSource
     * @param withAsTableLineages with-in
     * @return 当前操作的血缘关系
     */
    MultiTableLineageDto analyseFrom(SQLObject from, MultiTableLineageDto withAsTableLineages);

    /**
     * 分析where语句
     *
     * @param fromLineages 当前语句from的血缘关系（多个）
     * @param where        where语句
     * @return 解析此表达式可抽取的字段依赖
     */
    LinkedHashSet<TableFieldDependencyDto> analyseWhere(MultiTableLineageDto fromLineages, SQLExpr where);

    /**
     * @param fromLineages 当前语句from的血缘关系（多个）
     * @param expr         表达式
     * @return 解析此表达式可抽取的字段依赖
     */
    LinkedHashSet<TableFieldDependencyDto> analyseExpr(MultiTableLineageDto fromLineages, SQLExpr expr);

    /**
     * 分析order by语句
     *
     * @param tableLineage      当前语句的血缘关系
     * @param fromTableLineages 当前语句from的血缘关系（多个）
     * @param orderBy           orderBy语句
     */
    void analyseOrderBy(TableLineageDto tableLineage, MultiTableLineageDto fromTableLineages, SQLOrderBy orderBy);

    /**
     * group by 语句分析
     *
     * @param tableLineage      当前语句的血缘关系
     * @param fromTableLineages 当前语句from的血缘关系（多个）
     * @param groupBy           group by语句
     */
    void analyseGroupBy(TableLineageDto tableLineage, MultiTableLineageDto fromTableLineages, SQLSelectGroupByClause groupBy);

    /**
     * partitions语句分析
     *
     * @param tableLineage 当前语句的血缘关系
     * @param partitions   partitions语句
     */
    void analysePartitions(TableLineageDto tableLineage, List<SQLAssignItem> partitions);

    /**
     * 处理select字段表达式
     *
     * @param tableLineage      当前语句的血缘关系
     * @param fromTableLineages 当前语句from的血缘关系（多个）
     * @param selectExpr        select字段表达式
     * @return 当前解析出来的血缘关系字段(正常情况下返回一个 ， 如果是 * 时 ， 可以返回多个 ！)
     */
    LinkedHashSet<TableFieldLineageDto> analyseSelect(TableLineageDto tableLineage, MultiTableLineageDto fromTableLineages, SQLExpr selectExpr);
}
